﻿using System;
using System.Collections.Generic;
using Csla;
using Ent.AccesoDatos;

namespace Ent.Inscripcion.Core.Core
{
  [Serializable]
  public class DocenteLista :
    ReadOnlyListBase<DocenteLista,DocenteInfo >
  {    

    #region Factory Methods

      public static DocenteLista GetDocenteLista(DocenteCriterio criteria)
    {
        return DataPortal.FetchChild<DocenteLista>(criteria);
    }

    private DocenteLista()
    { /* require use of factory methods */ }

    #endregion

    #region Data Access

    private void Child_Fetch(DocenteCriterio criteria)
    {
      RaiseListChangedEvents = false;
      IsReadOnly = false;
      // TODO: load values
      var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
      var parametros = new List<Parametro>
                           {
                               new Parametro("Identificacion", criteria.Identificacion),
                               new Parametro("Nombres", criteria.Nombre),
                               new Parametro("Apellidos", criteria.Apellido)
                           };
        //object objectData = null;
      var datos = accesoDatos.EjecutarReader("ObtenerDocentes", parametros);
      while (datos.Datos.Read())
      {
          Add(DocenteInfo.GetDocenteInfo(datos));
      }
      if (!datos.Datos.IsClosed) datos.Datos.Close();
      IsReadOnly = true;
      RaiseListChangedEvents = true;
    }

    #endregion
  }


  [Serializable]
  public class DocenteInfo : ReadOnlyBase<DocenteInfo>
  {
    #region Business Methods

      private static PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(o => o.Id, "Name");
      public Guid Id
      {
          get { return GetProperty(IdProperty); }
      }

      public static readonly PropertyInfo<string> NombreProperty = RegisterProperty<string>(c => c.Nombre);
      /// <Summary>
      /// Gets or sets the Nombre value.
      /// </Summary>
      public string Nombre
      {
          get { return GetProperty(NombreProperty); }
      }

      public static readonly PropertyInfo<string> ApellidosProperty = RegisterProperty<string>(c => c.Apellidos);
      /// <Summary>
      /// Obtiene o setea el valor del apellido
      /// </Summary>
      public string Apellidos
      {
          get { return GetProperty(ApellidosProperty); }
      }

      public static readonly PropertyInfo<string> IdentificacionProperty = RegisterProperty<string>(c => c.Identificacion);
      /// <Summary>
      /// Gets or sets the Identificacion value.
      /// </Summary>
      public string Identificacion
      {
          get { return GetProperty(IdentificacionProperty); }
      }

      public static readonly PropertyInfo<string> EmailProperty = RegisterProperty<string>(c => c.Email);
      /// <Summary>
      /// Gets or sets the Email value.
      /// </Summary>
      public string Email
      {
          get { return GetProperty(EmailProperty); }
      }

      public static readonly PropertyInfo<string> DireccionProperty = RegisterProperty<string>(c => c.Direccion);
      /// <Summary>
      /// Gets or sets the Direccion value.
      /// </Summary>
      public string Direccion
      {
          get { return GetProperty(DireccionProperty); }
      }

      public static readonly PropertyInfo<string> CelularProperty = RegisterProperty<string>(c => c.Celular);
      /// <Summary>
      /// Obitiene o setea el valor del campo celular
      /// </Summary>
      public string Celular
      {
          get { return GetProperty(CelularProperty); }
      }

      private static PropertyInfo<string> TelefonoProperty = RegisterProperty<string>(o => o.Telefono, "Name");
      public string Telefono
      {
          get { return GetProperty(TelefonoProperty); }
      }

      private static PropertyInfo<string> NombreCompletoProperty = RegisterProperty<string>(o => o.NombreCompleto, "Name");
      public string NombreCompleto
      {
          get { return GetProperty(NombreCompletoProperty); }
      }

    #endregion

    #region Factory Methods

    internal static DocenteInfo GetDocenteInfo(object childData)
    {
      return DataPortal.FetchChild<DocenteInfo>(childData);
    }

    private DocenteInfo()
    { /* require use of factory methods */ }

    #endregion

    #region Data Access

    private void Child_Fetch(Reader datos)
    {
        LoadProperty(IdProperty, Guid.Parse(datos.Datos.GetString(0)));
        LoadProperty(IdentificacionProperty, datos.Datos.GetString(1));
        LoadProperty(NombreProperty, datos.Datos.GetString(2));
        LoadProperty(ApellidosProperty, datos.Datos.GetString(3));
        LoadProperty(NombreCompletoProperty, string.Format("{0} {1}", datos.Datos.GetString(2), datos.Datos.GetString(3)));
        LoadProperty(CelularProperty, datos.Datos.GetString(4));
        LoadProperty(DireccionProperty, datos.Datos.GetString(5));
        LoadProperty(EmailProperty, datos.Datos.GetString(6));
        LoadProperty(TelefonoProperty, datos.Datos.GetString(7));
    }

    #endregion
  }
}
